7 października 2017

Ładowanie pakietów

library(dplyr)
library(tidyr)
library(ggplot2)
library(ggthemes)

Przygotowanie danych

mieszkania <- read.csv(file = "data/mieszkania_wroclaw_ceny.csv") %>% 
  mutate(duze = metraz > 50,
         pietro = ifelse(pietro == 0, "parter",
                         ifelse(pietro == pietro_maks, "ostatnie_pietro",
                                ifelse(pietro > 15, "wysoko",
                                       ifelse(pietro_maks < 3, "niska_zabudowa", "inne")))),
         pietro = factor(pietro),
         pokoj = factor(ifelse(n_pokoj > 3, ">3", n_pokoj)))
## Warning: package 'bindrcpp' was built under R version 3.3.2

Idea ggplot

Przypomnienie

srednia_cena_pokoje <- mieszkania %>%
  group_by(n_pokoj) %>% summarise(srednia_cena = mean(cena_m2))
ggplot(srednia_cena_pokoje, aes(x = n_pokoj, y = srednia_cena)) +
  geom_bar(stat = "identity")

  • Jeśli pominiemy paramter stat=identity to R zliczby wystąpienia
ggplot(mieszkania, aes(x = n_pokoj)) +
  geom_bar()

Zadania

  1. Stwórz wykres słupkowy pokazujący jak średni metraż zależy od liczby pokojów
  2. Dodaj wypełnienie (fill) kolorem zależnym od zmiennej n_pokoj
  3. Stwórz wykres pokazujący ile jest ofert w zależności od dzielnicy
  4. Dodaj wypełnienie zależne od zmiennej pokoj

ggplot(mieszkania, aes(x = dzielnica, y = ..count..)) +
  geom_bar(aes(fill = pokoj), position = "stack")

  • Aby móc łatwo porównać skalujemy każdy słupek do tej samej wysokości
  • Gdzie mamy największe, a gdzie najmniejsze mieszkania?
ggplot(mieszkania, aes(x = dzielnica, y = ..count..)) +
  geom_bar(aes(fill = pokoj), position = "fill")

Wykres punktowy

Wykres punktowy

  • Każda obserwacja odpowiada jednemu punktowi na wykresie
  • Wyznaczamy jaka zmienna ma odpowiadać każdej z osi
ggplot(mieszkania, aes(x = dzielnica, y = cena_m2)) +
  geom_point()

ggplot(mieszkania, aes(x = dzielnica, y = cena_m2, col = duze)) +
  geom_point()

  • Na poprzednim wykresie wszystko się zlewa
  • Dodajemy opcję, żeby poszczególne punkty na siebie nie nachodziły
ggplot(mieszkania, aes(x = dzielnica, y = cena_m2, col = duze)) +
  geom_point(position = "jitter")

  • Ustawienie punktów jest tutaj losowe
set.seed(1410)
ggplot(mieszkania, aes(x = dzielnica, y = cena_m2)) +
  geom_point(position = "jitter")

Zadania

  1. Narysuj wykres zależności ceny mieszkania od jego powierzchni
  2. Zaznacz dodatkowo kolorem dzielnicę
  3. Narysuj wykres, który pokazuje zależność między powierzchnią mieszkania a liczbą pokojów
  4. Pokaż zależność ceny \(m^2\) od zmiennej pietro
  5. (opcjonalne) Dodaj do wykresu parametr alpha = 0.2. Co się zmieniło?

Facets - podziały

Chcemy:

  • zobaczyć jakie są ceny \(m^2\) w grupach zależnych od dzielnicy
  • porównać średni metraż w zależności od piętra i liczby pokojów
  • zestawić ze sobą wizulizacje w grupach wyznaczonych przez zmienne

Co jeśli chcemy zobaczyć rozkład punktów w grupach zależnych od liczby pokojów?

ggplot(mieszkania, aes(x = dzielnica, y = cena_m2)) +
  geom_point(position = "jitter") +
  facet_wrap(~ pokoj)

ggplot(mieszkania, aes(x = dzielnica, y = cena_m2)) +
  geom_point(position = "jitter") +
  facet_wrap(~ pokoj, labeller = label_both)

ggplot(mieszkania, aes(x = dzielnica, y = cena_m2)) +
  geom_point(position = "jitter") +
  facet_wrap(~ pokoj + pietro, labeller = label_both)

ggplot(mieszkania, aes(x = dzielnica, y = cena_m2)) +
  geom_point(position = "jitter") +
  facet_grid(pietro ~ pokoj, labeller = label_both)

ggplot(mieszkania, aes(x = dzielnica, y = cena_m2)) +
  geom_boxplot() +
  facet_wrap(~ pokoj, labeller = label_both)

ggplot(mieszkania, aes(x = dzielnica, y = cena_m2, color = duze)) +
  geom_point(position = "jitter") +
  facet_grid(pietro ~ pokoj, labeller = label_both)

Zadania

Gęstość

Gęstość

  • Zorientowanie jakich wartości można się spodziewać
  • Odporne na małe wahania
ggplot(mieszkania, aes(x = cena_m2)) +
  geom_density()

  • Podział ze względu na zmienną pokoj
  • Mało czytelny ze względu na zbyt mocne kolory
ggplot(mieszkania, aes(x = cena_m2, fill = pokoj)) +
  geom_density()

  • Dodanie przezroczystości
ggplot(mieszkania, aes(x = cena_m2, fill = pokoj)) +
  geom_density(alpha = 0.2) 

ggplot(mieszkania, aes(x = cena_m2, fill = pokoj)) +
  geom_density() +
  facet_wrap(~pokoj, ncol=1)

  • Parametr adjust odpowiada za ,,chropowatość"
ggplot(mieszkania, aes(x = cena_m2, fill = pokoj)) +
  geom_density(adjust = 0.5) +
  facet_wrap(~pokoj, ncol=1)

Zadania

  1. Zwizualizuj jak cena \(m^2\) zależy od dzielnicy. Jakie płyną stąd wnioski?
  2. Zwizualizuj jak metraż zależy od liczby pokojów
  3. Zobacz jak wyglądają powyższe wykresy w zależności od wartości parametru adjust
  4. (opcjonalnie) Dla większej przejrzystości spróbuj ograniczyć możliwe wartości na osi x xlim(min, max)
ggplot(mieszkania, aes(x = metraz, fill = pokoj)) +
  geom_density(adjust = 2) +
  facet_wrap(~pokoj, ncol=1)

Mapy

Kartogrm

load("data/mapa_dzielnic.Rdata")

plot_data <- mieszkania %>%
  group_by(dzielnica) %>%
  summarise(cena_m2 = mean(cena_m2)) %>%
  inner_join(granice_dzielnic, by=c("dzielnica"="id")) 

ggplot(plot_data) +
  geom_polygon(aes(x=long, y=lat, group = dzielnica, fill = cena_m2))

ggplot(plot_data) +
  geom_polygon(aes(x=long, y=lat, group = dzielnica, fill = cena_m2)) +
  coord_map()

Zadania

  1. Narysuj kartogram z przeciętną wielkością mieszkania w poszczególnych dzielnicach
  2. Narysuj kartogram pokazujący zróżnicowanie cen (odchylenie standardowe) w poszcególnych dzielnicach
  3. Narysuj kartogram pokazujący jakie są najmnniejsze dostępne mieszkania w poszczególnych dzielnicach

Dodatki

Upiększenie wykresu

  • Zamiast wymyślać koło…
  • ggthemes
  • scale_fill_
library(ggthemes)

ggplot(srednia_cena_pokoje, aes(x = n_pokoj, y = srednia_cena, fill = srednia_cena)) +
  geom_bar(stat = "identity") +
  scale_fill_gradient2_tableau(palette = "Light Red-Green") +
  theme_economist_white()
## Warning: Non Lab interpolation is deprecated

ggplot(plot_data) +
  geom_polygon(aes(x=long, y=lat, group = dzielnica, fill = cena_m2)) +
  coord_map() +
  scale_fill_gradient2_tableau() + #skala kolorów z programu tableau
  theme_fivethirtyeight()  #wygląd wykresu wzorowany na fivethirtyeight
## Warning: Non Lab interpolation is deprecated

Bee swarm

library(ggbeeswarm)
ggplot(mieszkania, aes(x = dzielnica, y = cena_m2, color = duze)) +
  geom_quasirandom() +
  facet_grid(pietro ~ pokoj, labeller = label_both)